<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/**
 * 默认绑定:
 *  当直接调用一个函数的时候, 就是默认绑定
 *  1. 非严格模式下, 默认绑定到 window上
 *  2. 严格模式下,
 *
 * 隐式绑定:
 *  当使用 对象.方法()这种方式调用, 称之为隐式绑定
 *  this绑定到前面那个对象上
 *
 * new 绑定:
 *  使用new来调用构造函数的方式, new绑定
 *  this是绑定在新创建的那个对象上
 *
 * 显示绑定:
 *  call, apply,
 *      都是一锤子买卖. 仅仅这一次调用的时候使用了显示绑定, 对原函数没有任何的影响
 *
 *      call和apply的区别, 就是参数的传递的方式.
 *          call:的参数是一个一个的传递
 *          apply:把要传递的参数封装到一个数组中去传递
 *
 *  bind: 固定绑定  es6新增
 *      调用函数对象的bind方法, 返回一个固定this绑定的新的函数
 *      对原来的函数没有影响
 *  bind > call, apply > new > 隐式
 */
var obj = {
    name: "a"
}
function foo(){
    console.log(this.name);
}
var f = foo.bind(obj);

var obj2 = {
    name: "b",
    foo : f
};
obj2.foo()

/*Math.sum = function (){
    return Array.prototype.reduce.call(arguments, function (a, ele){
        return a + ele;
    }, 0)
}
var a = [10, 20, 40, 2, 4, 100, 60];
console.log(Math.sum.apply(Math, a));*/

/*var a = [10, 20, 40, 2, 4, 100, 60];
var max = Math.sum.apply(Math, a);
console.log(max);*/




/*var obj1 = {
    name: "李四",
    foo: function (){
        console.log(this.name);
    }
}
var obj2 = {
    name: "张三"
}
obj1.foo.call(obj2)*/

/*function foo(a, b){
    console.log(this.name, a, b);
}

foo.call({name:"abc"}, 10, 20)
foo.apply({name:"abc"}, [10, 20])*/

/*var obj = {
    name : "a",
    foo : function (){
        console.log(this);
    }
}

var foo = obj.foo;
var obj1 = new foo()
console.log(obj1);*/

/*function foo(){
    this.name = "abc"
    console.log(this);
}
var obj = new foo();
console.log(obj);*/


/*var obj1 = {
    name: "李四",
    foo: function (){
        console.log(this.name);
    }
}
var obj2 = {
    name: "张三",
    foo: obj1.foo
}

obj2.foo()*/




/*var name = "张三"
var obj = {
    name: "李四",
    foo: function (){
        console.log(this.name);
    }
}
var foo = obj.foo;
foo()*/

/*function foo(){
    console.log(this);
}

var obj = {
    name : "李四",
    foo : foo
}
obj.foo()*/




/*"use strict"
function foo(){
    console.log(this);
}
foo()*/
</script>
</body>
</html>